package com.mexcad.servlets;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.mexcad.db.connectors.CatalogosConnector;
import com.mexcad.db.connectors.CreditoConnector;
import com.mexcad.db.dto.BeanCargaPago;
import com.mexcad.db.dto.CargoPago;
import com.mexcad.db.dto.Credito;
import com.mexcad.db.dto.Renta;
import com.mexcad.db.dto.RentaUploadMonto;
import com.mexcad.db.dto.Usuario;
import com.mexcad.db.utils.ArchivoEntrada;
import com.mexcad.exceptions.ArchivoCargaException;
import com.mexcad.utils.Constantes;
import com.mexcad.utils.LeeArchivo;



public class UploadArchivoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public static final String EXCEL = "text/plain";
	public static final String EXCEL1 = "application/vnd.ms-excel";
	
	public static final String EXCEL2 = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
	public static final String EXCEL3 = "application/octet-stream";
	
	public static final String NOMBREARCHIVO= "nombreArchivo";
	public static final String IMAGE="imageFile";
	public static final String OBSERVACIONES="textObser"; 

	private BeanCargaPago bean;
	
	private static Log logger = LogFactory.getLog(UploadArchivoServlet.class);
	
	
	/*
	 * Handles the HTTP POST method.
	 * @param request servlet request
	 * @param response servlet response
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		Integer usuario=0;
		String usr=null;
		if(session!=null){
			usuario = (Integer)session.getAttribute("usrLog");
			if(usuario==null){
				List<Usuario> list = CatalogosConnector.getAllUsuarios();
				usuario =new Integer(list.get(0).getCkUsuario().getIdUsuario());
			}
			
		}else{
			List<Usuario> list = CatalogosConnector.getAllUsuarios();
			usuario =list.get(0).getCkUsuario().getIdUsuario();
		}
		BeanCargaPago ok=null;
		int tipoArchivo =(Integer)session.getAttribute("tipoArchivo");
		if( tipoArchivo==1){
			ok=getNSaveFileCreditos(request,usuario);
		}else{
			ok=getNSaveFilePagos(request,usuario);
		}
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String salida = "<html> <body>";
		salida += "<table align=\"center\"width=\"500\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">";
		salida+="<tr> \n <td align=\"center\"><p>&nbsp;</p> \n <p><span style=\"color: #B00; border-color: ; font-size: larger;\">";
		if(ok == null){
			salida+="Error de transferencia revisar el formato del archivo</span></p>";
		}else{
			if(tipoArchivo == 1){
				salida+="Se realizó la carga del archivo de forma exitosa</span></p>";
			}else{
				
				salida+="Se realizó la carga del archivo de forma exitosa<br/>";
				salida+="El monto total de los pagos es: $"+bean.getMontoPago()+"<br/>";
				if(bean.getLista() !=null && bean.getLista().size()>0){
					List<RentaUploadMonto> listErr=bean.getLista(); 
					salida+="Los siguientes pagos no se realizaron <br/>";
					salida+="<table><tr><td>Credito</td><td>Monto</td><td>Fecha</td></tr>";
					
					for(int i=0;i<listErr.size();++i){
						RentaUploadMonto r = listErr.get(i);
						salida+="<tr>";
						salida+="<td>"+r.getIdCredito()+"</td><td>"+r.getMonto()+"</td><td>"+r.getFecha()+"</td>";
						salida+="</tr>";
						
					}
					salida+="</table>";
					
					salida+="</span></p>";
				}
				
				
			}
		}
		
		salida+="<p>&nbsp;</p></td></tr></table>";
		
		salida += " </body></html>";			
		out.println(salida);
		
		out.println("");
		out.println("");
		
		out.close();
	}


	public BeanCargaPago getNSaveFileCreditos(HttpServletRequest request, int usuario) {
		BufferedInputStream bis = null;
		DataInputStream  dis = null;
		

		
			// Chequea que sea un request multipart (que se este enviando un file)
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			System.out.println("Is multipart="+isMultipart);
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// maxima talla que sera guardada en memoria
			factory.setSizeThreshold(4096);
			// si se excede de la anterior talla, se ira guardando temporalmente, en la sgte direccion
			factory.setRepository(new File(Constantes.REPOSITORIO_CARGA));
			ServletFileUpload upload = new ServletFileUpload(factory);
			//maxima talla permisible (si se excede salta al catch)
			upload.setSizeMax(10000000);
			List fileItems=null;
			try {
				fileItems = upload.parseRequest(request);
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
			//obtiene el file enviado
		if(fileItems !=null){	
			Iterator it = fileItems.iterator();
			int cont=0;
			
			while(it.hasNext()){
				FileItem fi = (FileItem)it.next();
				if(cont ==2){
					String nombreArchivo = fi.getName();
					if(nombreArchivo !=null)
						nombreArchivo=nombreArchivo.substring(nombreArchivo.lastIndexOf(Constantes.DIV)+1,nombreArchivo.length());
					
					InputStream is=null;
					try {
						is = fi.getInputStream();
					} catch (IOException e) {
						// TODO Auto-generated catch block
					//	e.printStackTrace();
						return null;
					}
					if(is != null){
						bis = new BufferedInputStream(is);
						if(bis !=null){
							dis = new DataInputStream(bis);
							List<Credito> listado=null;
							try {
								listado = LeeArchivo.getListaCreditosCargados(dis);
							} catch (ArchivoCargaException e) {
								// TODO Auto-generated catch block
								//e.printStackTrace();
								return null;
							}catch (IOException e) {
								System.out.println(e.getMessage());
								// TODO Auto-generated catch block
								e.printStackTrace(System.out);
								return null;
							} catch(NumberFormatException e){
								System.out.println(e.getMessage());
								e.printStackTrace(System.out);
								return null;
							}
							if(listado!= null){
								for(int i=0;i<listado.size();++i){
									Credito credito = listado.get(i);
									CreditoConnector.guardaCreditoPorCarga(credito,usuario);
								}
							}else{
								return null;
							}
							String path=Constantes.REPOSITORIO_CARGA;
						
							String fileName=nombreArchivo;
							try {
								fi.write(new File(path, fileName));
							} catch (Exception e) {
								e.printStackTrace();
							
							}
						}else{
							return null;
						}
					}else{
						return null;
					}
				}
				cont++;
			}
			
			 try {
				 if(bis!= null)
					 bis.close();
				 else
					 return null;
				 if(dis!=null)
					 dis.close();
				 else return null;
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			}
		    
	}
			
		
		return new BeanCargaPago();
	}
	
	public BeanCargaPago getNSaveFilePagos(HttpServletRequest request, int idUsuario) {
		BufferedInputStream bis = null;
		DataInputStream  dis = null;

	
		
			// Chequea que sea un request multipart (que se este enviando un file)
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			System.out.println("Is multipart="+isMultipart);
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// maxima talla que sera guardada en memoria
			factory.setSizeThreshold(4096);
			// si se excede de la anterior talla, se ira guardando temporalmente, en la sgte direccion
			factory.setRepository(new File(Constantes.REPOSITORIO_CARGA));
			ServletFileUpload upload = new ServletFileUpload(factory);
			//maxima talla permisible (si se excede salta al catch)
			upload.setSizeMax(10000000);
			List fileItems=null;
			try {
				fileItems = upload.parseRequest(request);
			} catch (FileUploadException e) {
				e.printStackTrace();
				return null;
			}
			//obtiene el file enviado
		if(fileItems !=null){	
			Iterator it = fileItems.iterator();
			int cont=0;
			
			while(it.hasNext()){
				FileItem fi = (FileItem)it.next();
				if(cont ==2){
					String nombreArchivo = fi.getName();
					if(nombreArchivo !=null)
						nombreArchivo=nombreArchivo.substring(nombreArchivo.lastIndexOf(Constantes.DIV)+1,nombreArchivo.length());
					
					InputStream is=null;
					try {
						is = fi.getInputStream();
					} catch (IOException e) {
					//	e.printStackTrace();
						return null;
					}
					
					bis = new BufferedInputStream(is);
					dis = new DataInputStream(bis);
					bean=null;
						try {
							
							bean  = LeeArchivo.guardaPagosByStream(dis);
							
						} catch (ArchivoCargaException e) {
							
							//e.printStackTrace();
							return null;
						}catch (IOException e) {
							//e.printStackTrace();
							return null;
						} catch(NumberFormatException e){
							return null;
						} catch (Exception e){
							return null;
						}
					
					
				}
				cont++;
			}
			
			 try {
				 bis.close();
				 dis.close();
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			}
		    
	}
			
		
		return bean;
	}

	
	
	
	
	
	public String obtieneNombreArchivo(String nombre){
		String nueva="";
		for(int i = 0; i<nombre.length();  i++){
			String caracter = nombre.substring(i, i+1);
			
			if(caracter.equals("\\")){
				nueva = nombre.substring(i, nombre.length());
			}
		}
		
		nueva = nueva.substring(1, nueva.length());
			
		return nueva;
		
	}
	
	public String obtieneExtensionArchivo(String nombre){
		String extension="";
		
		for(int i=0; i < nombre.length(); i++){
			String caracter = nombre.substring(i, i+1);
			
			if(caracter.equals(".")){
				extension = nombre.substring(i+1,nombre.length());
			}
		}
		return extension;
	}
}
